package com.rj.bd.kj.dc.aes;

/**
 * @desc  : 对称加密算法
 * @Author : jjr
 */

import com.rj.bd.kj.dc.MyAbstractClass;
import com.rj.bd.kj.utils.MyExceptionUtils;

import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;

public class SymmetricEncryption extends MyAbstractClass {


    /**
     * @desc 声明一个SecretKey类型的成员变量，用于存储对称密钥
     */
    private SecretKey secretKey;

    /**
     * @desc  构造方法，接收一个字符串作为密钥，并将其转换为SecretKey对象
     * @param key
     */
    public SymmetricEncryption(String key) {
        this.secretKey = new SecretKeySpec(key.getBytes(), "AES");
    }

    /**
     * @desc 加密数据
     * @param data
     * @return
     */
    @Override
    public String encrypt(String data) {
        try {
            Cipher cipher = Cipher.getInstance("AES");// 获取Cipher实例，指定使用AES算法
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);// 初始化Cipher实例为加密模式，传入密钥
            byte[] encryptedBytes = cipher.doFinal(data.getBytes()); // 执行加密操作，将明文数据转换为密文字节数组
            return Base64.getEncoder().encodeToString(encryptedBytes);// 将密文字节数组进行Base64编码，转换为字符串形式以便于存储和传输

        } catch (Exception e) {
            MyExceptionUtils.handlerExceptions(e);
        }
        return data;
    }


    /**
     * @desc 解密数据
     * @param encryptedData
     * @return
     */
    @Override
    public String decrypt(String encryptedData)  {

        try {
            Cipher cipher = Cipher.getInstance("AES");
            cipher.init(Cipher.DECRYPT_MODE, secretKey); // 初始化Cipher实例为解密模式，并传入密钥
            byte[] decodedBytes = Base64.getDecoder().decode(encryptedData);// 将Base64编码的密文字符串解码为字节数组
            byte[] decryptedBytes = cipher.doFinal(decodedBytes); // 执行解密操作，将密文字节数组转换回明文数据
            // 将解密后的字节数组转换为字符串并返回
            return new String(decryptedBytes);

        }  catch (Exception e) {
            MyExceptionUtils.handlerExceptions(e);
        }
        return encryptedData;
    }
}